package com.example.rabc.monitor;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;
import java.util.List;

/**
 * 监控数据服务类
 */
@Service
public class MonitorDataService {
    private final MonitorDataRepository repository;
    private final ObjectMapper objectMapper;

    public MonitorDataService(MonitorDataRepository repository, ObjectMapper objectMapper) {
        this.repository = repository;
        this.objectMapper = objectMapper;
    }

    /**
     * 保存监控事件数据到数据库
     * @param event 监控事件
     */
    public void saveMonitorData(MonitorEvent event) {
        try {
            String dataJson = objectMapper.writeValueAsString(event.getData()); // 序列化事件数据为JSON字符串
            MonitorData monitorData = new MonitorData(
                    event.getEventType(),
                    event.getTimestamp(),
                    dataJson
            );
            repository.save(monitorData); // 保存监控数据到数据库
        } catch (JsonProcessingException e) {
            // 记录序列化错误但不影响监控流程
            System.err.println("Failed to serialize monitor data: " + e.getMessage());
        }
    }

    /**
     * 根据事件类型和时间范围查询监控数据，按时间戳升序排序
     * @param eventType 事件类型
     * @param startTime 开始时间戳（包含）
     * @param endTime 结束时间戳（包含）
     * @return 符合条件的监控数据列表
     */
    public List<MonitorData> getMonitorData(String eventType, Long startTime, Long endTime) {
        return repository.findByEventTypeAndTimestampBetweenOrderByTimestampAsc(
                eventType, startTime, endTime);
    }

    /**
     * 根据事件类型查询最新的监控数据，按时间戳降序排序
     * @param eventType 事件类型
     * @param limit 最多返回的记录数
     * @return 符合条件的最新监控数据列表
     */
    public List<MonitorData> getRecentMonitorData(String eventType, int limit) {
        Pageable pageable = PageRequest.of(0, limit);
        return repository.findByEventTypeOrderByTimestampDesc(eventType, pageable);
    }
}